package com.uva.dbcs.practica1.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.rmi.RemoteException;
import java.sql.SQLException;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.xml.rpc.ServiceException;

import com.uva.dbcs.gestionDeFacturas.despliegue.impl.Factura;
import com.uva.dbcs.gestionDeFacturas.despliegue.impl.GestorDeFacturas;
import com.uva.dbcs.gestionDeFacturas.despliegue.impl.GestorDeFacturasServiceLocator;
import com.uva.dbcs.practica1.business.LoginUser;

/**
 * Servlet implementation class LoginServlet
 */
public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private String ruta = "";

	// private GestorDeFacturasService servicio;

	// @WebServiceRef(wsdlLocation="http://localhost:8082/GestorDeFacturasService/GestorDeFacturas?wsdl")

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public LoginServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {
			processRequest(request, response);
		} catch (SQLException ex) {
			Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE,
					null, ex);
		} catch (ClassNotFoundException ex) {
			Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE,
					null, ex);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {
			processRequest(request, response);
		} catch (SQLException ex) {
			Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE,
					null, ex);
		} catch (ClassNotFoundException ex) {
			Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE,
					null, ex);
		}
	}

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException,
			SQLException, ClassNotFoundException, RemoteException {
		response.setContentType("text/html;charset=UTF-8");

		PrintWriter out = response.getWriter();

		/********** PRUEBA DE WEB SERVICE *************/
		// servicio=new GestorDeFacturasService();
		// GestorDeFacturas gestor= servicio.getGestorDeFacturasPort();

		// GestorDeFacturasProxy p=new GestorDeFacturasProxy();
		GestorDeFacturasServiceLocator gestor = new GestorDeFacturasServiceLocator();
		try {
			GestorDeFacturas gFact = gestor.getGestorDeFacturasPort();
			/*
			 * Calendar cdate= new GregorianCalendar(); Date hoyDate= new
			 * Date(); final long MILLSPORDIA = 24 * 60 * 60 * 1000;
			 * //Milisegundos al día
			 * 
			 * //Prueba buscar todas las facturas Factura[] fact=
			 * gFact.getFacturas(); int a=0; SimpleDateFormat format= new
			 * SimpleDateFormat("dd/MM/yyyy"); Date date; while(a<fact.length){
			 * date= fact[a].getFechaFactura().getTime();
			 * 
			 * long dif= (hoyDate.getTime()-date.getTime())/MILLSPORDIA;
			 * System.out.println("Diferencia: "+dif);
			 * 
			 * if(dif>45){
			 * System.out.println("Factura pendiente de pago-->"+fact
			 * [a].getIdFactura()); }
			 * 
			 * String fechaFactura= format.format(date);
			 * System.out.println(fact[a].getIdFactura()+ "||"
			 * +fact[a].getImporte()+ "||" + fechaFactura); a++; }
			 */

			// Prueba buscar factura por id
			/*
			 * System.out.println("******************"); Factura fa=
			 * gFact.getFacturaById(1); System.out.println(fa.getImporte());
			 */

			// Prueba crear factura

			// /gFact.crearFactura(cdate, cdate, 1, 1, 10.00, false);

			// prueba actualizar factura pendiente
			// gFact.actualizarPendienteFactura(1, false);

			// Prueba obtener facturas pendientes
			/*
			 * Date hoyDate= new Date(); Calendar calend=
			 * Calendar.getInstance(); calend.setTime(hoyDate);
			 * calend.add(Calendar.DATE,-45);
			 */
			System.out.println("******************");

			Factura[] f = gFact.getFacturasPendientes();

			int b = 0;
			while (b < f.length) {
				System.out.println(f[b].getIdFactura());
				b++;
			}

		} catch (ServiceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		HttpSession sesion = request.getSession();
		if (sesion.getAttribute("usuario") == null) { // si no existe una sesion

			int idCliente = 0;
			String usuario = request.getParameter("usuario");
			String contrasena = request.getParameter("contrasena");

			LoginUser validar = new LoginUser();
			if (!validar.validarUsuario(usuario)) {
				// throw new MiTiendaException("Usuario No Registrado");
				out.println("No existe el usuario");
			} else {

				if (!validar.validarContrasena(usuario, contrasena)) {
					// throw new MiTiendaException("Clave incorrecta");
					out.println("Contraseña incorrecta");
				} else {
					idCliente = validar.obtenerIdCliente(usuario);

					// se crean las variables sesiones del nombre de usuario
					// y su identificador en la BD
					sesion.setAttribute("usuario", usuario);
					sesion.setAttribute("us_id", idCliente);

					// se define la ruta a donde se debe redireccionar la acción
					this.ruta = "/ReservasServlet";
					RequestDispatcher respuesta = getServletContext()
							.getRequestDispatcher(this.ruta);
					respuesta.forward(request, response);
					// sesion.setAttribute("siguienteURL", ruta);
				}
			}

			this.ruta = "/ReservasServlet";
			RequestDispatcher respuesta = getServletContext()
					.getRequestDispatcher(this.ruta);
			respuesta.forward(request, response);

		} else { // si existe una sesion

			if (request.getParameter("Logout") != null) {

				sesion.removeAttribute("usuario");
				sesion.removeAttribute("us_id");
			}

			this.ruta = "/ReservasServlet";
			RequestDispatcher respuesta = getServletContext()
					.getRequestDispatcher(this.ruta);
			respuesta.forward(request, response);
		}

	}
}
